# PrimaryKey.java

    package org.codefilarete.stalactite.sql.ddl.structure;

    import java.util.Collection;

    import org.codefilarete.tool.collection.Iterables;
    import org.codefilarete.tool.collection.KeepOrderSet;

    /**
     * A definition of a primary key
     *
     * @author Guillaume Mary
     */
    public class PrimaryKey<T extends Table<T>, ID> implements Key<T, ID> {

    	private final T table;
    	private final KeepOrderSet<Column<T, ?>> columns = new KeepOrderSet<>();

    	public PrimaryKey(Collection<Column<T, Object>> columns) {
    		this.table = Iterables.first(columns).getTable();
    		this.columns.addAll(columns);
    	}

    	public PrimaryKey(Column<T, Object> column, Column<T, Object> ... additionalColumns) {
    		this.table = column.getTable();
    		this.addColumns(column, additionalColumns);
    	}

    	@Override
    	public T getTable() {
    		return table;
    	}

    	public void addColumns(Column<T, Object> column, Column<T, Object> ... additionalColumns) {
    		addColumn(column);
    		for (Column<T, ?> additionalColumn : additionalColumns) {
    			addColumn(additionalColumn);
    		}
    	}

    	public <O> void addColumn(Column<T, O> column) {
    		this.columns.add(column);
    	}

    	@Override
    	public KeepOrderSet<Column<T, ?>> getColumns() {
    		return new KeepOrderSet<>(columns);
    	}

    	@Override
    	public boolean isComposed() {
    		return columns.size() > 1;
    	}
    }